package com.shlh.saas.service;

import com.shlh.saas.entity.EmailSendRecord;
import com.shlh.saas.entity.UserEmail;
import com.shlh.saas.model.dto.CustomEmailSendDTO;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 邮件服务接口
 */
public interface EmailService {
    
    /**
     * 发送简单邮件
     * @param to 收件人邮箱（多个用分号分隔）
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 发送结果
     */
//    boolean sendSimpleEmail(String to, String subject, String content, Long userId, String phone);
    
    /**
     * 发送HTML格式邮件
     * @param to 收件人邮箱（多个用分号分隔）
     * @param subject 邮件主题
     * @param content HTML内容
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 发送结果
     */
//    boolean sendHtmlEmail(String to, String subject, String content, Long userId, String phone);
    
    /**
     * 发送带附件的邮件
     * @param to 收件人邮箱（多个用分号分隔）
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param attachments 附件列表
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 发送结果
     */
//    boolean sendAttachmentEmail(String to, String subject, String content, List<MultipartFile> attachments, Long userId, String phone);
    
    /**
     * 定时发送HTML格式邮件
     * @param to 收件人邮箱（多个用分号分隔）
     * @param subject 邮件主题
     * @param content HTML内容
     * @param scheduledTime 计划发送时间
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 安排结果
     */
//    boolean scheduleHtmlEmail(String to, String subject, String content, LocalDateTime scheduledTime, Long userId, String phone);
    
    /**
     * 定时发送带附件的邮件
     * @param to 收件人邮箱（多个用分号分隔）
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param attachments 附件列表
     * @param scheduledTime 计划发送时间
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 安排结果
     */
//    boolean scheduleAttachmentEmail(String to, String subject, String content, List<MultipartFile> attachments, LocalDateTime scheduledTime, Long userId, String phone);
    
    /**
     * 获取用户邮件发送记录
     * @param userId 用户ID
     * @param phone 用户手机号
     * @param page 页码
     * @param size 每页大小
     * @return 发送记录
     */
    Map<String, Object> getEmailSendRecords(Long userId, String phone, int page, int size);
    
    /**
     * 删除邮件发送记录
     * @param recordId 记录ID
     * @param userId 用户ID
     * @return 删除结果
     */
    boolean deleteEmailRecord(Long recordId, Long userId);
    
    /**
     * 获取所有邮件发送记录（不分页，用于统计图表）
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 所有邮件发送记录列表
     */
    List<EmailSendRecord> getAllEmailSendRecords(Long userId, String phone);

    boolean saveEmailRecord(String email, String password, int result, String emailProvider);

    UserEmail getUserEmail(Long userId);
    
    /**
     * 获取用户已验证的邮箱列表
     * @param userId 用户ID
     * @return 已验证的邮箱列表
     */
    List<UserEmail> getVerifiedEmails(Long userId);
    
    /**
     * 根据用户ID和邮箱地址获取邮箱授权码
     * @param userId 用户ID
     * @param email 邮箱地址
     * @return 邮箱授权码，如果未找到则返回null
     */
    String getEmailAuthCode(Long userId, String email);
    
    /**
     * 获取用户的所有邮箱配置（包括已验证和未验证的）
     * @param userId 用户ID
     * @return 用户的所有邮箱配置列表
     */
    List<UserEmail> getAllUserEmails(Long userId);
    
    /**
     * 添加邮箱配置（状态为未验证）
     * @param email 邮箱地址
     * @param emailProvider 邮箱发行商
     * @return 添加的邮箱配置
     */
    UserEmail addEmailConfig(String email, String emailProvider);
    
    /**
     * 添加邮箱配置（状态为未验证），包含密码/OAuth信息
     * @param email 邮箱地址
     * @param emailProvider 邮箱发行商
     * @param password 密码或OAuth信息
     * @return 添加的邮箱配置
     */
    UserEmail addEmailConfig(String email, String emailProvider, String password);
    
    /**
     * 保存用户邮箱配置
     * @param userEmail 用户邮箱配置对象
     * @return 保存后的用户邮箱配置
     */
    UserEmail saveUserEmail(UserEmail userEmail);

    /**
     * 获取Outlook设备码授权信息
     * @param clientId 客户端ID
     * @param tenantId 租户ID
     * @return 包含设备码、验证URL和用户码的Map
     */
    Map<String, String> getOutlookDeviceCode(String clientId, String tenantId);

    /**
     * 根据ID获取用户邮箱配置
     * @param id 邮箱配置ID
     * @return 邮箱配置信息
     */
    UserEmail getUserEmailById(Long id);

    UserEmail getUserEmailByUserIdAndEmail(Long userId, String email);

    UserEmail findById(Long id);

    boolean saveEmail(Long userId, String email, String deviceCode, String accessToken, String refreshToken, LocalDateTime expiry);

    int saveUserEmailByOuth(UserEmail userEmail);

    int saveEmailSuccess(Long userId, String email, int i);


    int deleteUserEmail(Long userId, String email);


    int updateUserEmail(UserEmail userEmail);

    boolean saveSendEmailRecord(CustomEmailSendDTO customEmailSendDTO);


}